/**
 * 图片服务
 * 针对存储在阿里 OSS 的图片进行处理，支持图片裁剪，缩放，格式转换等,详细的参数请参考下面文档
 * @param {Object} config 配置
 * {
 * 	w: [1-4096] 图片宽度
 * 	h: [1-4096] 图片高度
 * 	q: [1-100] 小写 q 相对压缩 大写 Q 绝对压缩
 * 	limit: [0, 1] 指定当目标缩略图大于原图时是否处理。值是 1 表示不处理；值是 0 表示处理。
 * 	format: [jpg , png, webp, bmp] 文件格式
 * 	resize: [	// 缩放配置，详细见 80 行
 * 		HEIGHT_AUTO,
 * 		WIDTH_AUTO,
 * 		SHORT_SIDE_SCALE,
 * 		SHORT_SIDE_SCALE,
 * 		LONG_SIDE_SCALE,
 * 		SHORT_SIDE_SCALE_MIDDLE_CLIP,
 * 		LONG_SIZE_SCALE_FILLING
 * 	]
 * }
 *
 * @see https://help.aliyun.com/document_detail/44688.html
 */

module.exports = config => {
  if (!isPlainObject(config)) {
    throw new Error('config musth be an object')
  }

  const baseProgress = 'x-oss-process=image/'

  // 图片缩放相关属性
  let resize = []

  if (config.resize && RESIZE[config.resize]) {
    resize.push('resize')
    resize.push(RESIZE[config.resize].call(config))

    // 缩略限制
    resize.push(
      progress({
        limit: config.limt === 0 || config.limit === 1 ? config.limit : 0
      })
    )
  }

  // 图片质量相关属性
  let quality = ['quality']
  if (config.q !== undefined || config.Q !== undefined) {
    config.q !== undefined
      ? quality.push(
          progress({ q: config.q >= 1 && config.q <= 100 ? config.q : 90 })
        )
      : quality.push(
          progress({ Q: config.Q >= 1 && config.Q <= 100 ? config.Q : 90 })
        )
  } else {
    quality.push(progress({ q: 90 }))
  }

  let format = []
  if (['jpg', 'png', 'webp', 'bmp'].includes(config.format)) {
    format = format.concat(['format', config.format])
  }

  let allProgress = [resize, quality, format]
    .filter(item => item.length)
    .map(item => item.join(','))
    .join('/')

  return baseProgress + allProgress
}

/**
 * 缩放默认配置
 *
 * 等比列缩放
 * HEIGHT_AUTO                        宽度固定 高度自适应
 * WIDTH_AUTO                         高度固定 宽度自适应
 * SHORT_SIDE_SCALE                   限定宽高 按短边缩放
 * LONG_SIDE_SCALE                    限定宽高 按长边缩放
 *
 * 固定宽高缩放
 * SHORT_SIDE_SCALE_MIDDLE_CLIP       按短边缩放 剧中裁剪
 * LONG_SIZE_SCALE_FILLING            按长边缩放 缩略填充
 */
const RESIZE = {
  HEIGHT_AUTO() {
    return progress({
      m: 'lfit',
      w: this.w
    })
  },
  WIDTH_AUTO() {
    return progress({
      m: 'lfit',
      h: this.h
    })
  },
  SHORT_SIDE_SCALE() {
    return progress({
      m: 'mfit',
      w: this.w,
      h: this.h
    })
  },
  LONG_SIDE_SCALE() {
    return progress({
      m: 'lfit',
      w: this.w,
      h: this.h
    })
  },
  SHORT_SIDE_SCALE_MIDDLE_CLIP() {
    return progress({
      m: 'fill',
      w: this.w,
      h: this.h
    })
  },
  LONG_SIZE_SCALE_FILLING() {
    return progress({
      m: 'pad',
      w: this.w,
      h: this.h
    })
  }
}

/**
 * 将对象格式化成 key_value,key_value
 * @param  {Object}
 * @return {String}
 */
const progress = params => {
  let result = []
  for (let item of Object.entries(params)) {
    result.push(item.join('_'))
  }
  return result.join(',')
}

/**
 * 判断 obj 是否为对象
 * @param
 * @return {Boolean}
 */
const isPlainObject = obj =>
  Object.prototype.toString.call(obj) === '[object Object]'

/**
 * 裁剪的最大宽度宽度
 * @param
 * @return {Number}
 */
const docW = wx.getSystemInfoSync().windowWidth;
wx.$tailorMaxW = docW * 2 < 750 ? docW * 2 : 750
